๋ฆฌ์กํธ ์ฑ๋ฅ์ ๋น๋ฐ์ ํํค์ณ ๋ณด์ธ์. ์ด ์ข ํฉ ๊ฐ์ด๋๋ ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ, ๊ฐ์ DOM ๋น๊ต(Diffing), ๊ทธ๋ฆฌ๊ณ ํต์ฌ ์ต์ ํ ์ ๋ต์ ์ค๋ช ํฉ๋๋ค.
๋ฆฌ์กํธ์ ๋น๊ฒฐ: ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ฐ์ DOM ๋น๊ต(Diffing) ์ฌ์ธต ๋ถ์
ํ๋ ์น ๊ฐ๋ฐ์ ์ธ๊ณ์์ ๋ฆฌ์กํธ๋ ๋์ ์ด๊ณ ์ํธ์์ฉ์ ์ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์์ด ์ง๋ฐฐ์ ์ธ ์์น๋ฅผ ํ๋ฆฝํ์ต๋๋ค. ๊ทธ ์ธ๊ธฐ๋ ๋จ์ํ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ฟ๋ง ์๋๋ผ ๋๋ผ์ด ์ฑ๋ฅ์์ ๋น๋กฏ๋ฉ๋๋ค. ํ์ง๋ง ๋ฌด์์ด ๋ฆฌ์กํธ๋ฅผ ๊ทธ๋ ๊ฒ ๋น ๋ฅด๊ฒ ๋ง๋ค๊น์? ๊ทธ ๋ต์ ๋ง๋ฒ์ด ์๋๋๋ค. ๋ฐ๋ก ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ(Reconciliation algorithm)์ผ๋ก ์๋ ค์ง ๋ฐ์ด๋ ์์ง๋์ด๋ง์ ์ฐ๋ฌผ์ ๋๋ค.
๋ง์ ๊ฐ๋ฐ์์๊ฒ ๋ฆฌ์กํธ์ ๋ด๋ถ ์๋ ๋ฐฉ์์ ๋ธ๋๋ฐ์ค์ ๊ฐ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๊ณ , ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, UI๊ฐ ์๋ฒฝํ๊ฒ ์ ๋ฐ์ดํธ๋๋ ๊ฒ์ ์ง์ผ๋ด ๋๋ค. ํ์ง๋ง ์ด ์ํํ ํ๋ก์ธ์ค ๋ค์ ์๋ ๋ฉ์ปค๋์ฆ, ํนํ ๊ฐ์ DOM๊ณผ ๊ทธ ๋น๊ต(diffing) ์๊ณ ๋ฆฌ์ฆ์ ์ดํดํ๋ ๊ฒ์ ์ข์ ๋ฆฌ์กํธ ๊ฐ๋ฐ์์ ์๋ํ ๊ฐ๋ฐ์๋ฅผ ๊ตฌ๋ถํ๋ ๊ธฐ์ค์ด ๋ฉ๋๋ค. ์ด ๊น์ ์ง์์ ๊ณ ๋๋ก ์ต์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๊ณ , ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ๋๋ฒ๊น ํ๋ฉฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง์ ์ผ๋ก ๋ง์คํฐํ ์ ์๋ ํ์ ์ค๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋๋ ๋ฆฌ์กํธ์ ํต์ฌ ๋ ๋๋ง ํ๋ก์ธ์ค์ ๋น๋ฐ์ ํํค์น ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ ์ง์ ์ ์ธ DOM ์กฐ์์ด ๋น์ฉ์ด ๋ง์ด ๋๋์ง, ๊ฐ์ DOM์ด ์ด๋ป๊ฒ ์ฐ์ํ ํด๊ฒฐ์ฑ ์ ์ ๊ณตํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ด ์ด๋ป๊ฒ ํจ์จ์ ์ผ๋ก UI๋ฅผ ์ ๋ฐ์ดํธํ๋์ง ํ๊ตฌํ ๊ฒ์ ๋๋ค. ๋ํ ๊ธฐ์กด์ ์คํ ์ฌ์กฐ์ ์(Stack Reconciler)์์ ํ๋์ ํ์ด๋ฒ ์ํคํ ์ฒ(Fiber Architecture)๋ก์ ์งํ๋ฅผ ์ดํด๋ณด๊ณ , ์ค๋ ๋น์ฅ ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ๊ธฐ ์ํด ๊ตฌํํ ์ ์๋ ์คํ ๊ฐ๋ฅํ ์ ๋ต์ผ๋ก ๋ง๋ฌด๋ฆฌํ ๊ฒ์ ๋๋ค.
ํต์ฌ ๋ฌธ์ : ์ ์ง์ ์ ์ธ DOM ์กฐ์์ ๋นํจ์จ์ ์ธ๊ฐ
๋ฆฌ์กํธ์ ํด๊ฒฐ์ฑ ์ ์ ๋๋ก ์ดํดํ๊ธฐ ์ํด์๋ ๋จผ์ ๊ทธ๊ฒ์ด ํด๊ฒฐํ๋ ๋ฌธ์ ๋ฅผ ์์์ผ ํฉ๋๋ค. ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ(DOM)์ HTML ๋ฌธ์๋ฅผ ํํํ๊ณ ์ํธ์์ฉํ๊ธฐ ์ํ ๋ธ๋ผ์ฐ์ API์ ๋๋ค. ์ด๋ ๊ฐ์ฒด์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๋์ด ์์ผ๋ฉฐ, ๊ฐ ๋ ธ๋๋ ๋ฌธ์์ ์ผ๋ถ(์๋ฆฌ๋จผํธ, ํ ์คํธ, ์์ฑ ๋ฑ)๋ฅผ ๋ํ๋ ๋๋ค.
ํ๋ฉด์ ๋ณด์ด๋ ๊ฒ์ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๋, ์ฐ๋ฆฌ๋ ์ด DOM ํธ๋ฆฌ๋ฅผ ์กฐ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ก์ด ๋ชฉ๋ก ํญ๋ชฉ์ ์ถ๊ฐํ๋ ค๋ฉด ์๋ก์ด `
- ` ๋
ธ๋์ ์ถ๊ฐํฉ๋๋ค. ์ด๋ ๊ฐ๋จํด ๋ณด์ด์ง๋ง, DOM ์์
์ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค. ๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ ์ด์์ ๋ฐ ๋ฆฌํ๋ก์ฐ(Layout and Reflow): ์์์ ๊ธฐํํ์ ์์ฑ(๋๋น, ๋์ด, ์์น ๋ฑ)์ ๋ณ๊ฒฝํ ๋๋ง๋ค ๋ธ๋ผ์ฐ์ ๋ ์ํฅ์ ๋ฐ๋ ๋ชจ๋ ์์์ ์์น์ ํฌ๊ธฐ๋ฅผ ๋ค์ ๊ณ์ฐํด์ผ ํฉ๋๋ค. ์ด ํ๋ก์ธ์ค๋ฅผ "๋ฆฌํ๋ก์ฐ" ๋๋ "๋ ์ด์์"์ด๋ผ๊ณ ํ๋ฉฐ, ์ ์ฒด ๋ฌธ์์ ๊ฑธ์ณ ์ฐ์์ ์ผ๋ก ๋ฐ์ํ์ฌ ์๋นํ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ์๋ชจํ ์ ์์ต๋๋ค.
- ๋ฆฌํ์ธํ (Repainting): ๋ฆฌํ๋ก์ฐ ํ, ๋ธ๋ผ์ฐ์ ๋ ์ ๋ฐ์ดํธ๋ ์์์ ๋ํด ํ๋ฉด์ ํฝ์ ์ ๋ค์ ๊ทธ๋ ค์ผ ํฉ๋๋ค. ์ด๋ฅผ "๋ฆฌํ์ธํ " ๋๋ "๋์คํฐํ"๋ผ๊ณ ํฉ๋๋ค. ๋ฐฐ๊ฒฝ์๊ณผ ๊ฐ์ ๊ฐ๋จํ ๊ฒ์ ๋ณ๊ฒฝํ๋ฉด ๋ฆฌํ์ธํธ๋ง ๋ฐ์ํ ์ ์์ง๋ง, ๋ ์ด์์ ๋ณ๊ฒฝ์ ํญ์ ๋ฆฌํ์ธํธ๋ฅผ ์ ๋ฐํฉ๋๋ค.
- ๋๊ธฐ์ ๋ฐ ๋ธ๋กํน(Blocking): DOM ์์ ์ ๋๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ DOM์ ์์ ํ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์ข ์ข ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๋ฅผ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ ๋ ฅ์ ์๋ตํ๋ ๊ฒ์ ํฌํจํ ๋ค๋ฅธ ์์ ์ ์ผ์ ์ค์งํด์ผ ํ๋ฉฐ, ์ด๋ ๋๋ฆฌ๊ฑฐ๋ ๋ฉ์ถ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ์ด๊ธฐ ๋ ๋๋ง: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฒ์ ๋ก๋๋ ๋, ๋ฆฌ์กํธ๋ UI์ ๋ํ ์์ ํ ๊ฐ์ DOM ํธ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ธฐ ์ค์ DOM์ ์์ฑํฉ๋๋ค.
- ์ํ ์ ๋ฐ์ดํธ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด(์: ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญ), ๋ฆฌ์กํธ๋ ์๋ก์ด ์ํ๋ฅผ ๋ฐ์ํ๋ ์๋ก์ด ๊ฐ์ DOM ํธ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
- ๋น๊ต(Diffing): ์ด์ ๋ฆฌ์กํธ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ ๊ฐ์ ๊ฐ์ DOM ํธ๋ฆฌ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค: ์ด์ ํธ๋ฆฌ(์ํ ๋ณ๊ฒฝ ์ )์ ์๋ก์ด ํธ๋ฆฌ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ "๋น๊ต(diffing)" ์๊ณ ๋ฆฌ์ฆ์ ์คํํ์ฌ ์ด ๋ ํธ๋ฆฌ๋ฅผ ๋น๊ตํ๊ณ ์ ํํ ์ฐจ์ด์ ์ ์๋ณํฉ๋๋ค.
- ์ผ๊ด ์ฒ๋ฆฌ ๋ฐ ์ ๋ฐ์ดํธ: ๋ฆฌ์กํธ๋ ์ค์ DOM์ ์๋ก์ด ๊ฐ์ DOM๊ณผ ์ผ์น์ํค๊ธฐ ์ํด ํ์ํ ๊ฐ์ฅ ํจ์จ์ ์ด๊ณ ์ต์ํ์ ์์ ์งํฉ์ ๊ณ์ฐํฉ๋๋ค. ์ด๋ฌํ ์์ ์ ํจ๊ป ์ผ๊ด ์ฒ๋ฆฌ๋์ด ๋จ์ผ์ ์ต์ ํ๋ ์์๋ก ์ค์ DOM์ ์ ์ฉ๋ฉ๋๋ค.
- ์ ์ฒด ์ด์ ํธ๋ฆฌ๋ฅผ ํด์ฒดํ๊ณ , ๋ชจ๋ ์ด์ ์ปดํฌ๋ํธ๋ฅผ ๋ง์ดํธ ํด์ ํ๋ฉฐ ๊ทธ ์ํ๋ฅผ ํ๊ดดํฉ๋๋ค.
- ์๋ก์ด ์๋ฆฌ๋จผํธ ํ์ ์ ๊ธฐ๋ฐ์ผ๋ก ์์ ํ ์๋ก์ด ํธ๋ฆฌ๋ฅผ ์ฒ์๋ถํฐ ๊ตฌ์ถํฉ๋๋ค.
- ํญ๋ชฉ B
- ํญ๋ชฉ C
- ํญ๋ชฉ A
- ํญ๋ชฉ B
- ํญ๋ชฉ C
- ์ธ๋ฑ์ค 0์ ์ด์ ํญ๋ชฉ('ํญ๋ชฉ B')๊ณผ ์ธ๋ฑ์ค 0์ ์ ํญ๋ชฉ('ํญ๋ชฉ A')์ ๋น๊ตํฉ๋๋ค. ๋ค๋ฅด๋ฏ๋ก ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ ๋ณ๊ฒฝํฉ๋๋ค.
- ์ธ๋ฑ์ค 1์ ์ด์ ํญ๋ชฉ('ํญ๋ชฉ C')๊ณผ ์ธ๋ฑ์ค 1์ ์ ํญ๋ชฉ('ํญ๋ชฉ B')์ ๋น๊ตํฉ๋๋ค. ๋ค๋ฅด๋ฏ๋ก ๋ ๋ฒ์งธ ํญ๋ชฉ์ ๋ณ๊ฒฝํฉ๋๋ค.
- ์ธ๋ฑ์ค 2์ ์ ํญ๋ชฉ('ํญ๋ชฉ C')์ด ์๋ ๊ฒ์ ๋ณด๊ณ ์ฝ์ ํฉ๋๋ค.
- ํญ๋ชฉ B
- ํญ๋ชฉ C
- ํญ๋ชฉ A
- ํญ๋ชฉ B
- ํญ๋ชฉ C
- ๋ฆฌ์กํธ๋ ์ ๋ชฉ๋ก์ ์์๋ค์ ๋ณด๊ณ 'b'์ 'c' ํค๋ฅผ ๊ฐ์ง ์๋ฆฌ๋จผํธ๋ฅผ ์ฐพ์ต๋๋ค.
- 'b'์ 'c' ํค๋ฅผ ๊ฐ์ง ์๋ฆฌ๋จผํธ๊ฐ ์ด๋ฏธ ์ด์ ๋ชฉ๋ก์ ์กด์ฌํ๋ค๋ ๊ฒ์ ์๊ณ ์์ผ๋ฏ๋ก, ๋จ์ํ ์ด๋์ํต๋๋ค.
- ์ด์ ์ ์กด์ฌํ์ง ์์๋ 'a' ํค๋ฅผ ๊ฐ์ง ์ ์๋ฆฌ๋จผํธ๊ฐ ์๋ ๊ฒ์ ๋ณด๊ณ , ์ด๋ฅผ ์์ฑํ๊ณ ์ฝ์ ํฉ๋๋ค.
- ... )`)์ ๋ชฉ๋ก์ด ์ฌ์ ๋ ฌ๋๊ฑฐ๋, ํํฐ๋ง๋๊ฑฐ๋, ์ค๊ฐ์ ํญ๋ชฉ์ด ์ถ๊ฐ/์ ๊ฑฐ๋ ์ ์๋ ๊ฒฝ์ฐ ์ํฐํจํด์ ๋๋ค. ์ด๋ ํค๊ฐ ์๋ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฐ์ฅ ์ข์ ํค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ID์ ๊ฐ์ด ๋ฐ์ดํฐ์์ ๊ฐ์ ธ์จ ๊ณ ์ ์๋ณ์์ ๋๋ค.
- ์ ์ง์ ๋ ๋๋ง: ๋ ๋๋ง ์์ ์ ์์ ๋ฉ์ด๋ฆฌ๋ก ๋๋์ด ์ฌ๋ฌ ํ๋ ์์ ๊ฑธ์ณ ๋ถ์ฐ์ํฌ ์ ์์ต๋๋ค.
- ์ฐ์ ์์ ์ง์ : ๋ค์ํ ์ ํ์ ์ ๋ฐ์ดํธ์ ๋ค๋ฅธ ์ฐ์ ์์ ์์ค์ ํ ๋นํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์ ๋ ฅ ํ๋์ ํ์ดํํ๋ ๊ฒ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ๋ณด๋ค ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋๋ค.
- ์ผ์ ์ค์ง ๋ฐ ์ค๋จ ๊ฐ๋ฅ์ฑ: ๋ฎ์ ์ฐ์ ์์์ ์ ๋ฐ์ดํธ ์์ ์ ์ผ์ ์ค์งํ์ฌ ๋์ ์ฐ์ ์์์ ์์ ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ๋ ์ด์ ํ์ ์๋ ์์ ์ ์ค๋จํ๊ฑฐ๋ ์ฌ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
- ๋ ๋/์ฌ์กฐ์ ๋จ๊ณ (๋น๋๊ธฐ): ์ด ๋จ๊ณ์์ ๋ฆฌ์กํธ๋ ํ์ด๋ฒ ๋ ธ๋๋ฅผ ์ฒ๋ฆฌํ์ฌ "์์ ์งํ ์ค(work-in-progress)" ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํฉ๋๋ค. ์ปดํฌ๋ํธ์ `render` ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ๋น๊ต ์๊ณ ๋ฆฌ์ฆ์ ์คํํ์ฌ DOM์ ์ด๋ค ๋ณ๊ฒฝ์ด ํ์ํ์ง ๊ฒฐ์ ํฉ๋๋ค. ๊ฒฐ์ ์ ์ผ๋ก, ์ด ๋จ๊ณ๋ ์ค๋จ ๊ฐ๋ฅํฉ๋๋ค. ๋ฆฌ์กํธ๋ ๋ ์ค์ํ ์ผ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ด ์์ ์ ์ผ์ ์ค์งํ๋ค๊ฐ ๋์ค์ ๋ค์ ์์ํ ์ ์์ต๋๋ค. ์ค๋จ๋ ์ ์๊ธฐ ๋๋ฌธ์, ๋ฆฌ์กํธ๋ ์ผ๊ด์ฑ ์๋ UI ์ํ๋ฅผ ํผํ๊ธฐ ์ํด ์ด ๋จ๊ณ ๋์ ์ค์ DOM ๋ณ๊ฒฝ์ ์ ์ฉํ์ง ์์ต๋๋ค.
- ์ปค๋ฐ ๋จ๊ณ (๋๊ธฐ): ์์ ์งํ ์ค ํธ๋ฆฌ๊ฐ ์์ฑ๋๋ฉด, ๋ฆฌ์กํธ๋ ์ปค๋ฐ ๋จ๊ณ์ ๋ค์ด๊ฐ๋๋ค. ๊ณ์ฐ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์ ธ์ ์ค์ DOM์ ์ ์ฉํฉ๋๋ค. ์ด ๋จ๊ณ๋ ๋๊ธฐ์์ด๋ฉฐ ์ค๋จ๋ ์ ์์ต๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ํญ์ ์ผ๊ด๋ UI๋ฅผ ๋ณผ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค. `componentDidMount` ๋ฐ `componentDidUpdate`์ ๊ฐ์ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋์ `useLayoutEffect`, `useEffect` ํ ์ ์ด ๋จ๊ณ์์ ์คํ๋ฉ๋๋ค.
- `React.memo()`: ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ์ํ ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)์ ๋๋ค. ์ปดํฌ๋ํธ์ props๋ฅผ ์๊ฒ ๋น๊ตํฉ๋๋ค. props๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ค๋ฉด, ๋ฆฌ์กํธ๋ ํด๋น ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง์ ๊ฑด๋๋ฐ๊ณ ๋ง์ง๋ง์ผ๋ก ๋ ๋๋ง๋ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
- `useCallback()`: ์ปดํฌ๋ํธ ๋ด๋ถ์ ์ ์๋ ํจ์๋ ๋ ๋๋ง๋ ๋๋ง๋ค ์ฌ์์ฑ๋ฉ๋๋ค. ์ด ํจ์๋ค์ `React.memo`๋ก ๊ฐ์ธ์ง ์์ ์ปดํฌ๋ํธ์ props๋ก ์ ๋ฌํ๋ฉด, ํจ์ prop์ด ๊ธฐ์ ์ ์ผ๋ก ๋งค๋ฒ ์๋ก์ด ํจ์์ด๊ธฐ ๋๋ฌธ์ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. `useCallback`์ ํจ์ ์์ฒด๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฌ, ์์กด์ฑ์ด ๋ณ๊ฒฝ๋ ๋๋ง ํจ์๊ฐ ์ฌ์์ฑ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- `useMemo()`: `useCallback`๊ณผ ์ ์ฌํ์ง๋ง ๊ฐ์ ์ํ ๊ฒ์ ๋๋ค. ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํฉ๋๋ค. ๊ณ์ฐ์ ์์กด์ฑ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ๋ค์ ์คํ๋ฉ๋๋ค. ์ด๋ ๋ ๋๋ง๋ง๋ค ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ ๋ฐฉ์งํ๊ณ , props๋ก ์ ๋ฌ๋๋ ์์ ์ ์ธ ๊ฐ์ฒด/๋ฐฐ์ด ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์์ฒ ๊ฐ์ ๋ ธ๋๊ฐ ์๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด ๋ณด์ธ์. ๋ง์ฝ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์ง์ DOM์ ์กฐ์ํ์ฌ ์ ์ฒด UI๋ฅผ ์์งํ๊ฒ ๋ค์ ๋ ๋๋งํ๋ค๋ฉด, ๋ธ๋ผ์ฐ์ ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ์ ์ฐ์ ๋ฐ์์ ๊ฐ์ํ๊ฒ ๋์ด ๋์ฐํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ด๋ํ ๊ฒ์ ๋๋ค.
ํด๊ฒฐ์ฑ : ๊ฐ์ DOM (VDOM)
๋ฆฌ์กํธ์ ๊ฐ๋ฐ์๋ค์ ์ง์ ์ ์ธ DOM ์กฐ์์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ธ์งํ์ต๋๋ค. ๊ทธ๋ค์ ํด๊ฒฐ์ฑ ์ ์ถ์ํ ๊ณ์ธต์ธ ๊ฐ์ DOM์ ๋์ ํ๋ ๊ฒ์ด์์ต๋๋ค.
๊ฐ์ DOM์ด๋ ๋ฌด์์ธ๊ฐ?
๊ฐ์ DOM์ ์ค์ DOM์ ๊ฐ๋ฒผ์ด ์ธ๋ฉ๋ชจ๋ฆฌ(in-memory) ํํ์ ๋๋ค. ๋ณธ์ง์ ์ผ๋ก UI๋ฅผ ์ค๋ช ํ๋ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ๋๋ค. VDOM ๊ฐ์ฒด๋ ์ค์ DOM ์๋ฆฌ๋จผํธ์ ์์ฑ์ ๋ฏธ๋ฌ๋งํ๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ๋จํ `
{ type: 'div', props: { className: 'container', children: 'Hello World' } }
์ด๊ฒ๋ค์ ๋จ์ง ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์, ์์ฑํ๊ณ ์กฐ์ํ๋ ๊ฒ์ด ๋ฏฟ์ ์ ์์ ์ ๋๋ก ๋น ๋ฆ ๋๋ค. ๋ธ๋ผ์ฐ์ API์์ ์ํธ์์ฉ์ด ์ ํ ์์ผ๋ฏ๋ก ๋ฆฌํ๋ก์ฐ๋ ๋ฆฌํ์ธํธ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
๊ฐ์ DOM์ ์ด๋ป๊ฒ ์๋ํ๋๊ฐ?
VDOM์ ์ ์ธ์ ์ธ UI ๊ฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์๊ฒ DOM์ ๋จ๊ณ๋ณ๋ก ์ด๋ป๊ฒ ๋ณ๊ฒฝํ ์ง ์ง์ํ๋ ๋์ (๋ช ๋ นํ), ์ฃผ์ด์ง ์ํ์ ๋ํด UI๊ฐ ์ด๋ป๊ฒ ๋ณด์ฌ์ผ ํ๋์ง๋ฅผ ๋จ์ํ ์ ์ธํฉ๋๋ค(์ ์ธํ). ๋๋จธ์ง๋ ๋ฆฌ์กํธ๊ฐ ์ฒ๋ฆฌํฉ๋๋ค.
๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
์ ๋ฐ์ดํธ๋ฅผ ์ผ๊ด ์ฒ๋ฆฌํจ์ผ๋ก์จ ๋ฆฌ์กํธ๋ ๋๋ฆฐ DOM๊ณผ์ ์ง์ ์ ์ธ ์ํธ์์ฉ์ ์ต์ํํ์ฌ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค. ์ด ํจ์จ์ฑ์ ํต์ฌ์ ๊ณต์์ ์ผ๋ก ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์๋ ค์ง "๋น๊ต" ๋จ๊ณ์ ์์ต๋๋ค.
๋ฆฌ์กํธ์ ์ฌ์ฅ: ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ
์ฌ์กฐ์ (Reconciliation)์ ๋ฆฌ์กํธ๊ฐ ์ต์ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๋ง๊ฒ DOM์ ์ ๋ฐ์ดํธํ๋ ๊ณผ์ ์ ๋๋ค. ์ด ๋น๊ต๋ฅผ ์ํํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ "๋น๊ต ์๊ณ ๋ฆฌ์ฆ(diffing algorithm)"์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ ๋๋ค.
์ด๋ก ์ ์ผ๋ก, ํ ํธ๋ฆฌ๋ฅผ ๋ค๋ฅธ ํธ๋ฆฌ๋ก ๋ณํํ๋ ๋ฐ ํ์ํ ์ต์ํ์ ๋ณํ ํ์๋ฅผ ์ฐพ๋ ๊ฒ์ ๋งค์ฐ ๋ณต์กํ ๋ฌธ์ ์ด๋ฉฐ, ์๊ณ ๋ฆฌ์ฆ ๋ณต์ก๋๋ O(nยณ) ์์ค์ ๋๋ค (n์ ํธ๋ฆฌ์ ๋ ธ๋ ์). ์ด๋ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋๋ฌด ๋๋ฆด ๊ฒ์ ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฆฌ์กํธ ํ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ผ๋ฐ์ ์ผ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ๋ช ๊ฐ์ง ๋ฐ์ด๋ ๊ด์ฐฐ์ ํตํด ํจ์ฌ ๋น ๋ฅธ O(n) ์๊ฐ ๋ณต์ก๋๋ก ์๋ํ๋ ํด๋ฆฌ์คํฑ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ์ต๋๋ค.
ํด๋ฆฌ์คํฑ: ๋น๊ต(Diffing)๋ฅผ ๋น ๋ฅด๊ณ ์์ธก ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ
๋ฆฌ์กํธ์ ๋น๊ต ์๊ณ ๋ฆฌ์ฆ์ ๋ ๊ฐ์ง ์ฃผ์ ๊ฐ์ ๋๋ ํด๋ฆฌ์คํฑ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค:
ํด๋ฆฌ์คํฑ 1: ๋ค๋ฅธ ํ์ ์ ์๋ฆฌ๋จผํธ๋ ๋ค๋ฅธ ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ค
์ด๊ฒ์ ์ฒซ ๋ฒ์งธ์ด์ ๊ฐ์ฅ ๊ฐ๋จํ ๊ท์น์ ๋๋ค. ๋ VDOM ๋ ธ๋๋ฅผ ๋น๊ตํ ๋, ๋ฆฌ์กํธ๋ ๋จผ์ ๊ทธ๋ค์ ํ์ ์ ๋ด ๋๋ค. ๋ง์ฝ ๋ฃจํธ ์๋ฆฌ๋จผํธ์ ํ์ ์ด ๋ค๋ฅด๋ฉด, ๋ฆฌ์กํธ๋ ๊ฐ๋ฐ์๊ฐ ํ๋๋ฅผ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ณํํ๋ ค๊ณ ์๋ํ์ง ์์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋์ , ๋ ๊ณผ๊ฐํ์ง๋ง ์์ธก ๊ฐ๋ฅํ ์ ๊ทผ ๋ฐฉ์์ ์ทจํฉ๋๋ค:
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๋ณ๊ฒฝ์ ์๊ฐํด ๋ณด์ธ์:
์ด์ : <div><Counter /></div>
์ดํ: <span><Counter /></span>
์์ `Counter` ์ปดํฌ๋ํธ๊ฐ ๋์ผํ๋๋ผ๋, ๋ฆฌ์กํธ๋ ๋ฃจํธ๊ฐ `div`์์ `span`์ผ๋ก ๋ณ๊ฒฝ๋ ๊ฒ์ ๋ด ๋๋ค. ๋ฆฌ์กํธ๋ ์ด์ `div`์ ๊ทธ ์์ `Counter` ์ธ์คํด์ค๋ฅผ ์์ ํ ๋ง์ดํธ ํด์ ํ๊ณ (์ํ๋ฅผ ์๊ฒ ๋จ), ์๋ก์ด `span`๊ณผ ์์ ํ ์๋ก์ด `Counter` ์ธ์คํด์ค๋ฅผ ๋ง์ดํธํ ๊ฒ์ ๋๋ค.
ํต์ฌ ์์ฝ: ์ํ๋ฅผ ๋ณด์กดํ๊ฑฐ๋ ํด๋น ํ์ ํธ๋ฆฌ์ ์ ์ฒด ๋ฆฌ๋ ๋๋ง์ ํผํ๊ณ ์ถ๋ค๋ฉด ์ปดํฌ๋ํธ ํ์ ํธ๋ฆฌ์ ๋ฃจํธ ์๋ฆฌ๋จผํธ ํ์ ์ ๋ณ๊ฒฝํ์ง ๋ง์ธ์.
ํด๋ฆฌ์คํฑ 2: ๊ฐ๋ฐ์๋ `key` Prop์ผ๋ก ์์ ์ ์ธ ์๋ฆฌ๋จผํธ๋ฅผ ๋ช ์ํ ์ ์๋ค
์ด๊ฒ์ ๊ฐ๋ฐ์๊ฐ ์ดํดํ๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉํด์ผ ํ ๊ฐ์ฅ ์ค์ํ ํด๋ฆฌ์คํฑ์ผ ๊ฒ์ ๋๋ค. ๋ฆฌ์กํธ๊ฐ ์์ ์๋ฆฌ๋จผํธ ๋ชฉ๋ก์ ๋น๊ตํ ๋, ๊ธฐ๋ณธ ๋์์ ๋ ์์ ๋ชฉ๋ก์ ๋์์ ์ํํ๋ฉฐ ์ฐจ์ด์ ์ด ์์ ๋๋ง๋ค ๋ณ๊ฒฝ(mutation)์ ์์ฑํ๋ ๊ฒ์ ๋๋ค.
์ธ๋ฑ์ค ๊ธฐ๋ฐ ๋น๊ต(Diffing)์ ๋ฌธ์ ์
ํญ๋ชฉ ๋ชฉ๋ก์ด ์๊ณ , ํค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ชฉ๋ก์ ๋งจ ์์ ์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ค๊ณ ์์ํด ๋ด ์๋ค.
์ด๊ธฐ ๋ชฉ๋ก:
์ ๋ฐ์ดํธ๋ ๋ชฉ๋ก ('ํญ๋ชฉ A'๋ฅผ ๋งจ ์์ ์ถ๊ฐ):
ํค๊ฐ ์์ผ๋ฉด, ๋ฆฌ์กํธ๋ ๊ฐ๋จํ ์ธ๋ฑ์ค ๊ธฐ๋ฐ ๋น๊ต๋ฅผ ์ํํฉ๋๋ค:
์ด๊ฒ์ ๋งค์ฐ ๋นํจ์จ์ ์ ๋๋ค. ๋ฆฌ์กํธ๋ ๋จ์ง ๋งจ ์์ ํ๋๋ฅผ ์ฝ์ ํ๋ฉด ๋ ๊ฒ์, ๋ถํ์ํ ๋ ๋ฒ์ ๋ณ๊ฒฝ๊ณผ ํ ๋ฒ์ ์ฝ์ ์ ์ํํ์ต๋๋ค. ๋ง์ฝ ์ด ๋ชฉ๋ก ํญ๋ชฉ๋ค์ด ์์ฒด ์ํ๋ฅผ ๊ฐ์ง ๋ณต์กํ ์ปดํฌ๋ํธ์๋ค๋ฉด, ์ปดํฌ๋ํธ ๊ฐ์ ์ํ๊ฐ ๋ค์์ด๋ ์ฌ๊ฐํ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ฒ๊ทธ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
`key` Prop์ ํ
`key` prop์ ํด๊ฒฐ์ฑ ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์๋ฆฌ๋จผํธ ๋ชฉ๋ก์ ์์ฑํ ๋ ํฌํจํด์ผ ํ๋ ํน๋ณํ ๋ฌธ์์ด ์์ฑ์ ๋๋ค. ํค๋ ๋ฆฌ์กํธ์๊ฒ ๊ฐ ์๋ฆฌ๋จผํธ์ ๋ํ ์์ ์ ์ธ ์๋ณ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋์ผํ ์์ ๋ฅผ ์ด๋ฒ์๋ ์์ ์ ์ด๊ณ ๊ณ ์ ํ ํค๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ์ดํด๋ด ์๋ค:
์ด๊ธฐ ๋ชฉ๋ก:
์ ๋ฐ์ดํธ๋ ๋ชฉ๋ก:
์ด์ ๋ฆฌ์กํธ์ ๋น๊ต ๊ณผ์ ์ ํจ์ฌ ๋ ๋๋ํด์ง๋๋ค:
์ด๊ฒ์ด ํจ์ฌ ๋ ํจ์จ์ ์ ๋๋ค. ๋ฆฌ์กํธ๋ ๋จ ํ ๋ฒ์ ์ฝ์ ๋ง ์ํํ๋ฉด ๋๋ค๋ ๊ฒ์ ์ ํํ๊ฒ ์๋ณํฉ๋๋ค. 'b'์ 'c' ํค์ ๊ด๋ จ๋ ์ปดํฌ๋ํธ๋ค์ ๋ณด์กด๋์ด ๋ด๋ถ ์ํ๋ฅผ ์ ์งํฉ๋๋ค.
ํค์ ๋ํ ์ค์ ๊ท์น: ํค๋ ํ์ ์๋ฆฌ๋จผํธ ์ฌ์ด์์ ์์ ์ ์ด๊ณ , ์์ธก ๊ฐ๋ฅํ๋ฉฐ, ๊ณ ์ ํด์ผ ํฉ๋๋ค. ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ํค๋ก ์ฌ์ฉํ๋ ๊ฒ(`items.map((item, index) =>
์งํ: ์คํ์์ ํ์ด๋ฒ ์ํคํ ์ฒ๋ก
์์์ ์ค๋ช ํ ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์๋ ๋์ ๋ฆฌ์กํธ์ ๊ธฐ๋ฐ์ด์์ต๋๋ค. ํ์ง๋ง ์ฌ๊ธฐ์๋ ํ ๊ฐ์ง ์ฃผ์ํ ํ๊ณ๊ฐ ์์์ต๋๋ค: ๋๊ธฐ์์ด๋ฉฐ ๋ธ๋กํน ๋ฐฉ์์ด๋ผ๋ ์ ์ ๋๋ค. ์ด ์ด๊ธฐ ๊ตฌํ์ ํ์ฌ ์คํ ์ฌ์กฐ์ ์(Stack Reconciler)๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
๊ณผ๊ฑฐ ๋ฐฉ์: ์คํ ์ฌ์กฐ์ ์ (Stack Reconciler)
์คํ ์ฌ์กฐ์ ์์์๋ ์ํ ์ ๋ฐ์ดํธ๊ฐ ๋ฆฌ๋ ๋๋ง์ ์ ๋ฐํ ๋, ๋ฆฌ์กํธ๋ ์ ์ฒด ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ํํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ ๊ณ์ฐํ๋ฉฐ, DOM์ ์ ์ฉํ๋ ๋ชจ๋ ๊ณผ์ ์ ๋จ์ผํ๊ณ ์ค๋จ ์๋ ์์๋ก ์ฒ๋ฆฌํ์ต๋๋ค. ์์ ์ ๋ฐ์ดํธ์ ๊ฒฝ์ฐ ์ด๊ฒ์ ๊ด์ฐฎ์์ต๋๋ค. ํ์ง๋ง ํฐ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ๊ฒฝ์ฐ ์ด ๊ณผ์ ์ ์๋นํ ์๊ฐ(์: 16ms ์ด์)์ด ๊ฑธ๋ ค ๋ธ๋ผ์ฐ์ ์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ ์ ์์์ต๋๋ค. ์ด๋ UI๊ฐ ์๋ตํ์ง ์๊ฒ ๋ง๋ค๊ณ , ํ๋ ์ ๋๋กญ, ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๋ ์ ๋๋ฉ์ด์ , ๊ทธ๋ฆฌ๊ณ ์ข์ง ์์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๋ฐํ์ต๋๋ค.
๋ฆฌ์กํธ ํ์ด๋ฒ ์๊ฐ (๋ฆฌ์กํธ 16+)
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ๋ฆฌ์กํธ ํ์ ํต์ฌ ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์์ ํ ์ฌ์์ฑํ๋ ์๋ ๊ฐ์ ํ๋ก์ ํธ์ ์ฐฉ์ํ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ๋ก ๋ฆฌ์กํธ 16์์ ์ถ์๋ ๊ฒ์ด ๋ฆฌ์กํธ ํ์ด๋ฒ(React Fiber)์ ๋๋ค.
ํ์ด๋ฒ ์ํคํ ์ฒ๋ ๋์์ฑ(concurrency)์ ๊ฐ๋ฅํ๊ฒ ํ๋๋ก ์ฒ์๋ถํฐ ์ค๊ณ๋์์ต๋๋ค. ๋์์ฑ์ด๋ ๋ฆฌ์กํธ๊ฐ ์ฌ๋ฌ ์์ ์ ๋์์ ์ฒ๋ฆฌํ๊ณ ์ฐ์ ์์์ ๋ฐ๋ผ ์์ ์ ์ ํํ ์ ์๋ ๋ฅ๋ ฅ์ ์๋ฏธํฉ๋๋ค.
"ํ์ด๋ฒ"๋ ์์ ๋จ์๋ฅผ ๋ํ๋ด๋ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ๋๋ค. ์ฌ๊ธฐ์๋ ์ปดํฌ๋ํธ, ๊ทธ ์ ๋ ฅ(props), ๊ทธ๋ฆฌ๊ณ ์ถ๋ ฅ(์์๋ค)์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ฒจ ์์ต๋๋ค. ์ค๋จ๋ ์ ์์๋ ์ฌ๊ท์ ์ํ ๋์ , ๋ฆฌ์กํธ๋ ์ด์ ํ์ด๋ฒ ๋ ธ๋๋ค์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ํ ๋ฒ์ ํ๋์ฉ ์ฒ๋ฆฌํฉ๋๋ค.
์ด ์๋ก์ด ์ํคํ ์ฒ๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ฃผ์ ๊ธฐ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค:
ํ์ด๋ฒ์ ๋ ๋จ๊ณ
ํ์ด๋ฒ ํ์์ ๋ ๋๋ง ํ๋ก์ธ์ค๋ ๋ ๊ฐ์ ๋ณ๊ฐ์ ๋จ๊ณ๋ก ๋๋ฉ๋๋ค:
ํ์ด๋ฒ ์ํคํ ์ฒ๋ `Suspense`, ๋์ ๋ ๋๋ง, `useTransition`, `useDeferredValue` ๋ฑ ๋ฆฌ์กํธ์ ๋ง์ ํ๋์ ์ธ ๊ธฐ๋ฅ๋ค์ ๊ธฐ๋ฐ์ด๋ฉฐ, ์ด ๋ชจ๋ ๊ธฐ๋ฅ๋ค์ ๊ฐ๋ฐ์๋ค์ด ๋ ๋ฐ์์ฑ ์๊ณ ์ ์ฐํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
๊ฐ๋ฐ์๋ฅผ ์ํ ์ค์ฉ์ ์ธ ์ต์ ํ ์ ๋ต
๋ฆฌ์กํธ์ ์ฌ์กฐ์ ๊ณผ์ ์ ์ดํดํ๋ฉด ๋ ์ฑ๋ฅ ์ข์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ํ์ ์ป๊ฒ ๋ฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์คํ ๊ฐ๋ฅํ ์ ๋ต์ ๋๋ค:
1. ๋ชฉ๋ก์๋ ํญ์ ์์ ์ ์ด๊ณ ๊ณ ์ ํ ํค๋ฅผ ์ฌ์ฉํ์ธ์
์ด๊ฒ์ ์๋ฌด๋ฆฌ ๊ฐ์กฐํด๋ ์ง๋์น์ง ์์ต๋๋ค. ๋ชฉ๋ก์ ๋ํ ๊ฐ์ฅ ์ค์ํ ๋จ์ผ ์ต์ ํ์ ๋๋ค. ๋ฐ์ดํฐ์์ ๊ณ ์ ํ ID(์: `product.id`)๋ฅผ ์ฌ์ฉํ์ธ์. ๋ชฉ๋ก์ด ์์ ํ ์ ์ ์ด๊ณ ์ ๋ ๋ณ๊ฒฝ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ๋ฐฐ์ด ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํผํ์ธ์.
2. ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ํผํ์ธ์
์ปดํฌ๋ํธ๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋ ๋ถ๋ชจ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋ ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. ๋๋ก๋ ์ปดํฌ๋ํธ์ ์ถ๋ ฅ์ด ๋์ผํจ์๋ ๋ถ๊ตฌํ๊ณ ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๋ค์์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค:
3. ์ค๋งํธํ ์ปดํฌ๋ํธ ๊ตฌ์ฑ
์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์กฐํํ๋ ๋ฐฉ์์ ์ฑ๋ฅ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ ์ํ์ ์ผ๋ถ๊ฐ ์์ฃผ ์ ๋ฐ์ดํธ๋๋ค๋ฉด, ๊ทธ๋ ์ง ์์ ๋ถ๋ถ๊ณผ ๋ถ๋ฆฌํ๋๋ก ๋ ธ๋ ฅํ์ธ์.
์๋ฅผ ๋ค์ด, ์์ฃผ ๋ณ๊ฒฝ๋๋ ์ ๋ ฅ ํ๋๋ก ์ธํด ์ ์ฒด ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ ๋จ์ผ์ ํฐ ์ปดํฌ๋ํธ๋ฅผ ๋๋ ๋์ , ํด๋น ์ํ๋ฅผ ๊ทธ ์์ฒด์ ๋ ์์ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์๊ฐ ํ์ดํํ ๋ ์์ ์ปดํฌ๋ํธ๋ง ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค.
4. ๊ธด ๋ชฉ๋ก ๊ฐ์ํํ๊ธฐ
์๋ฐฑ ๋๋ ์์ฒ ๊ฐ์ ํญ๋ชฉ์ด ์๋ ๋ชฉ๋ก์ ๋ ๋๋งํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ ์ ํ ํค๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ํ ๋ฒ์ ๋ชจ๋ ํญ๋ชฉ์ ๋ ๋๋งํ๋ ๊ฒ์ ๋๋ฆฌ๊ณ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ ์ ์์ต๋๋ค. ํด๊ฒฐ์ฑ ์ ๊ฐ์ํ(virtualization) ๋๋ ์๋์(windowing)์ ๋๋ค. ์ด ๊ธฐ์ ์ ํ์ฌ ๋ทฐํฌํธ์ ๋ณด์ด๋ ์์ ๋ถ๋ถ ์งํฉ์ ํญ๋ชฉ๋ง ๋ ๋๋งํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ๋ฉด ์ด์ ํญ๋ชฉ์ ๋ง์ดํธ ํด์ ๋๊ณ ์ ํญ๋ชฉ์ด ๋ง์ดํธ๋ฉ๋๋ค. `react-window` ๋ฐ `react-virtualized`์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด ํจํด์ ๊ตฌํํ๊ธฐ ์ํ ๊ฐ๋ ฅํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ฒฐ๋ก
๋ฆฌ์กํธ์ ์ฑ๋ฅ์ ์ฐ์ฐ์ด ์๋๋๋ค. ๊ทธ๊ฒ์ ๊ฐ์ DOM๊ณผ ํจ์จ์ ์ธ ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ค์ฌ์ผ๋ก ํ ์๋์ ์ด๊ณ ์ ๊ตํ ์ํคํ ์ฒ์ ๊ฒฐ๊ณผ์ ๋๋ค. ์ง์ ์ ์ธ DOM ์กฐ์์ ์ถ์ํํจ์ผ๋ก์จ, ๋ฆฌ์กํธ๋ ์๋์ผ๋ก ๊ด๋ฆฌํ๊ธฐ์๋ ์์ฒญ๋๊ฒ ๋ณต์กํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์ ๋ฐ์ดํธ๋ฅผ ์ผ๊ด ์ฒ๋ฆฌํ๊ณ ์ต์ ํํ ์ ์์ต๋๋ค.
๊ฐ๋ฐ์๋ก์ ์ฐ๋ฆฌ๋ ์ด ๊ณผ์ ์ ์ค์ํ ๋ถ๋ถ์ ๋๋ค. ๋น๊ต(diffing) ์๊ณ ๋ฆฌ์ฆ์ ํด๋ฆฌ์คํฑ์ ์ดํดํ๊ณ , ํค๋ฅผ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ฉฐ, ์ปดํฌ๋ํธ์ ๊ฐ์ ๋ฉ๋ชจ์ด์ ์ด์ ํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์คํ๊ฒ ๊ตฌ์กฐํํจ์ผ๋ก์จ, ์ฐ๋ฆฌ๋ ๋ฆฌ์กํธ์ ์ฌ์กฐ์ ์์ ๋ํญํ๋ ๊ฒ์ด ์๋๋ผ ํ๋ ฅํ์ฌ ์์ ํ ์ ์์ต๋๋ค. ํ์ด๋ฒ ์ํคํ ์ฒ๋ก์ ์งํ๋ ๊ฐ๋ฅํ ๊ฒ์ ๊ฒฝ๊ณ๋ฅผ ๋์ฑ ๋ํ์ผ๋ฉฐ, ์๋กญ๊ณ ์ ์ฐํ๋ฉฐ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ UI ์ธ๋๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค.
๋ค์์ ์ํ ๋ณ๊ฒฝ ํ UI๊ฐ ์ฆ์ ์ ๋ฐ์ดํธ๋๋ ๊ฒ์ ๋ณด๋ฉด, ์ ์ ์๊ฐ์ ๋ด์ด ๋ด๋ถ์์ ์ผ์ด๋๋ ๊ฐ์ DOM, ๋น๊ต ์๊ณ ๋ฆฌ์ฆ, ๊ทธ๋ฆฌ๊ณ ์ปค๋ฐ ๋จ๊ณ์ ์ฐ์ํ ์ถค์ ๊ฐ์ํด ๋ณด์ธ์. ์ด ์ดํด๋ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํด ๋ ๋น ๋ฅด๊ณ , ๋ ํจ์จ์ ์ด๋ฉฐ, ๋ ๊ฒฌ๊ณ ํ ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ์ด์ ๊ฐ ๋ ๊ฒ์ ๋๋ค.